package multi_thread.basic;

/**
 * Description: 通过继承 Thread类 来创建线程类。
 *
 * @author Cheng Jun
 * @version 1.0
 * @date 2019/10/28 17:01
 */
public class ThreadExample {
    public static void main(String[] args) throws InterruptedException {
        // 每个线程各卖10张票！
        // 线程名 可以自定义，可以相同
        MyThread myThread = new MyThread();
        MyThread myThread1 = new MyThread();
        MyThread myThread2 = new MyThread();
        MyThread myThread3 = new MyThread();
        System.out.println(myThread.getState());
        // 将控制台的输出结果，copy到notepad++ 看一共有多少行，从而确定超卖的票数
        myThread.start();
        myThread1.start();
        myThread2.start();
        myThread3.start();
    }
}

/**
 * 通过继承 Thread 的方式，实现多线程;
 * 注意：使用继承 Thread类的方法来创建线程类时，多个线程之间无法共享线程类的实例变量，所以用类变量演示超卖的情况
 */
class MyThread extends Thread {
    // 如果是实例变量，就不会有超卖问题
    private static int ticket = 100;

    @Override
    public void run() {
        for (int i = 0; i < 100; i++) {
            if (this.ticket > 0) {
                this.ticket--;
                System.out.println(this.getName() + " 卖票。ticket，" + "剩余门票：" + this.ticket);
                // 模拟业务逻辑所需的执行时间
                if (this.ticket % 2 == 0) {
                    try {
                        Thread.sleep(50);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
            }
        }
    }

}

